#include "shop.h"
#include "Object.h"
#include "Scene.h"
#include <iostream>
#include <unistd.h>
#include <limits>
void Shop::show()
{   
    while(1)
    {   
        system("clear");
        std::cout<<"====================商店=======================\n";
        std::cout<<"1、武器\n";
        std::cout<<"2、防具\n";
        std::cout<<"3、药品\n";
        std::cout<<"4、退出\n";
        std::cout<<"请选择你要的商品种类\n";
        p.show();
        int c = 0;
        std::cin>>c;
        if (std::cin.fail())
        {
            std::cin.clear(); // 清除错误状态
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 丢弃错误输入
            std::cout << "无效的选择，请重新输入。\n";
            sleep(1);
            continue; // 继续循环
        }
        switch (c)
        {
        case 1:
        {
            showWeapon();
        }
        break;
        case 2:
        {
            showDefencer();
        }
        break;
        case 3:
        {
            showMedicine();
        }
        break;
        case 4:
            system("clear");
            return;
        default:
            std::cout << "无效的选择，请重新输入。\n";
            break;
        }
        sleep(2);
    }
}

void Shop::showWeapon()
{
    while(1)
    {   
        system("clear");
        std::cout<<"====================商店=======================\n";
        std::cout<<"1、雷霆之锤\n";
        std::cout<<"2、狂暴之斧\n";
        std::cout<<"3、神圣长弓\n";
        std::cout<<"4、退出\n";
        std::cout<<"请选择你要的商品种类\n";
        p.show();
        int c = 0;
        std::cin>>c;
        if (std::cin.fail())
        {
            std::cin.clear(); // 清除错误状态
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 丢弃错误输入
            std::cout << "无效的选择，请重新输入。\n";
            sleep(1);
            continue; // 继续循环
        }
        switch (c)
        {
        case 1:
        {   
            std::string weapon1 = "雷霆之锤";
            // 创建武器工厂
            std::unique_ptr<PropFactory> weaponFactory = std::make_unique<WeaponFactory>();
            auto 雷霆之锤 = weaponFactory->createProp(10,weapon1,0,10); 
            if(p.Getmoney() >= 10)
            {
                printf(":");
                p.Setmoney(p.Getmoney() -10);
                p.GetBag().Insert(雷霆之锤);
            }
            else
            {
                std::cout<<"金币不足，购买失败。"<<std::endl;
            }
        }
        break;
        case 2:
        {
            std::string weapon1 = "狂暴之斧";
            Weapon* 狂暴之斧 = new Weapon(20,weapon1,0,20); 
            if(p.Getmoney() >= 20)
            {
                printf(":");
                p.Setmoney(p.Getmoney() -20);
                p.GetBag().Insert(std::make_shared<Weapon>(*狂暴之斧));
            }
            else
            {
                std::cout<<"金币不足，购买失败。"<<std::endl;
            }
        }
        break;
        case 3:
        {
            std::string weapon1 = "神圣长弓";
            Weapon* 神圣长弓 = new Weapon(30,weapon1,0,30); 
            if(p.Getmoney() >= 30)
            {
                printf(":");
                p.Setmoney(p.Getmoney() -30);
                p.GetBag().Insert(std::make_shared<Weapon>(*神圣长弓));
            }
            else
            {
                std::cout<<"金币不足，购买失败。"<<std::endl;
            }
        }
        break;
        case 4:
            return;
        default:
            std::cout << "无效的选择，请重新输入。\n";
            break;
        }
        sleep(1);
    }
}

void Shop::showDefencer()
{
    while(1)
    {   
        system("clear");
        std::cout<<"====================商店=======================\n";
        std::cout<<"1、守护之盾\n";
        std::cout<<"2、神圣壁垒\n";
        std::cout<<"3、雷霆护甲\n";
        std::cout<<"4、退出\n";
        std::cout<<"请选择你要的商品种类\n";
        p.show();
        int c = 0;
        std::cin>>c;
        if (std::cin.fail())
        {
            std::cin.clear(); // 清除错误状态
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 丢弃错误输入
            std::cout << "无效的选择，请重新输入。\n";
            sleep(1);
            continue; // 继续循环
        }
        switch (c)
        {
        case 1:
        {   
            std::string Defencer1 = "守护之盾";
            std::unique_ptr<PropFactory> defencerFactory = std::make_unique<DefencerFactory>();
            auto 守护之盾 = defencerFactory->createProp(10,Defencer1,0,10);
            if(p.Getmoney() >= 10)
            {
                printf(":");
                p.Setmoney(p.Getmoney() -10);
                p.GetBag().Insert(守护之盾);
            }
            else
            {
                std::cout<<"金币不足，购买失败。"<<std::endl;
            }
        }
        break;
        case 2:
        {
            std::string Defencer1 = "神圣壁垒";
            Defencer* 神圣壁垒 = new Defencer(20,Defencer1,0,20); 
            if(p.Getmoney() >= 20)
            {
                printf(":");
                p.Setmoney(p.Getmoney() -20);
                p.GetBag().Insert(std::make_shared<Defencer>(*神圣壁垒));
            }
            else
            {
                std::cout<<"金币不足，购买失败。"<<std::endl;
            }
        }
        break;
        case 3:
        {
            std::string Defencer1 = "雷霆护甲";
            Defencer* 雷霆护甲 = new Defencer(30,Defencer1,0,30); 
            if(p.Getmoney() >= 30)
            {
                printf(":");
                p.Setmoney(p.Getmoney() -30);
                p.GetBag().Insert(std::make_shared<Defencer>(*雷霆护甲));
            }
            else
            {
                std::cout<<"金币不足，购买失败。"<<std::endl;
            }
        }
        break;
        case 4:
            return;
        default:
            std::cout << "无效的选择，请重新输入。\n";
            break;
        }
        sleep(1);
    }
}

void Shop::showMedicine()
{
    while(1)
    {   
        system("clear");
        std::cout<<"====================商店=======================\n";
        std::cout<<"1、血瓶\n";
        std::cout<<"2、药水\n";
        std::cout<<"3、药瓶\n";
        std::cout<<"4、退出\n";
        std::cout<<"请选择你要的商品种类\n";
        p.show();
        int c = 0;
        std::cin>>c;
        if (std::cin.fail())
        {
            std::cin.clear(); // 清除错误状态
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 丢弃错误输入
            std::cout << "无效的选择，请重新输入。\n";
            sleep(1);
            continue; // 继续循环
        }
        switch (c)
        {
        case 1:
        {   
            std::string Medicine1 = "血瓶";
            std::unique_ptr<PropFactory> medicineFactory = std::make_unique<MedicineFactory>();
            auto 血瓶 = medicineFactory->createProp(10,Medicine1,0,10);
            if(p.Getmoney() >= 10)
            {
                printf(":");
                p.Setmoney(p.Getmoney() -10);
                p.GetBag().Insert(血瓶);
            }
            else
            {
                std::cout<<"金币不足，购买失败。"<<std::endl;
            }
        }
        break;
        case 2:
        {
            std::string Medicine1 = "药水";
            Medicine* 药水 = new Medicine(10,Medicine1,0,20); 
            if(p.Getmoney() >= 20)
            {
                printf(":");
                p.Setmoney(p.Getmoney() -20);
                p.GetBag().Insert(std::make_shared<Medicine>(*药水));
            }
            else
            {
                std::cout<<"金币不足，购买失败。"<<std::endl;
            }
        }
        break;
        case 3:
        {
            std::string Medicine1 = "药瓶";
            Medicine* 药瓶 = new Medicine(10,Medicine1,0,30); 
            if(p.Getmoney() >= 30)
            {
                printf(":");
                p.Setmoney(p.Getmoney() -30);
                p.GetBag().Insert(std::make_shared<Medicine>(*药瓶));
            }
            else
            {
                std::cout<<"金币不足，购买失败。"<<std::endl;
            }
        }
        break;
        case 4:
            return;
        default:
            std::cout << "无效的选择，请重新输入。\n";
            break;
        }
        sleep(1);
    }
}

// void TreasureBox:: RemoveFromScene()
// {
//     int index = GetTreasureBoxIndex(this);
//     if (index != -1) {
//         RemoveTreasureBox(index);
//     }
// }

// void TreasureBox::InitTreasureBoxes()
// {
//     for (int i = 0; i < 5; ++i) 
//     {
//         int x = std::rand() % MapSize;
//         int y = std::rand() % MapSize; 
//         do {
//             x = std::rand() % MapSize;
//             y = std::rand() % MapSize;
//         } while (isOverlap(treasureBoxes, x, y));
//         const std::string c = "宝箱";
//         const std::string d = "📦";
//          // 创建并添加宝箱
//         auto treasureBox = std::make_shared<TreasureBox>(x, y, c, d,p);
//         treasureBoxes.push_back(treasureBox);
//     }
// }

// bool TreasureBox::isOverlap(std::vector<std::shared_ptr<TreasureBox>> &treasureBoxes, int x, int y)
// {
//     for (const auto& box : treasureBoxes) 
//      {
//         if (box->GetX() == x && box->GetY() == y) {
//             return true; // 发现重叠
//         }
//     }
//     return false;
// }

// void TreasureBox::RemoveTreasureBox(int index)
// {
//     if (index >= 0 && index < treasureBoxes.size()) 
//     {
//         treasureBoxes.erase(treasureBoxes.begin() + index);
//     }
// }

// int TreasureBox::GetTreasureBoxIndex(TreasureBox *t)
// {
//     // auto & treasureBoxe = GetTrea();
//     for (int i = 0; i < treasureBoxes.size(); ++i) 
//     {
//         if (treasureBoxes[i].get() == t) 
//         {
//             return i;
//         }
//     }
//     return -1;  
// }
